﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
//using TextToPinyin;

namespace ET.DBCommon
{
    public class CheckWordsHelper
    {
        //public static string yao = "么约要邀妖腰夭吆訞鴢撽殀喓鴁幺楆約葽枖祅";
        //public static string liang = "俩两啢脼魉唡緉裲兩掚蜽魎両倆";
        //public static string san = "三参叁毶鬖叄毵犙厁參弎毿叅";
        //public static string si = "四饲似食寺肆伺涘鈻孠祀飤杫笥梩肂驷俟泗覗嗣洠鈶娰牭巳竢飼柶耜騃価汜蕼兕洍釲姒瀃銉禩飴亖枱耛駟佀榹儩泤貄";
        //public static string wu = "伍武五舞侮午捂鹉乄忤膴迕儛鵡堥牾娬瑦廡碔仵憮躌倵旿陚啎熓娒珷庑瞴怃摀逜潕妩玝嫵甒";
        //public static string liu = "六溜碌馏磟遛霤鹨磂翏雡餾廇鷚窌鎦飂塯鬸澑";
        //public static string guai = "拐柺枴罫箉";
        //public static string ba = "疤吧巴八扒捌叭笆芭仈羓夿豝鲃丷玐粑哵蚆峇魞扷柭哱岜釟朳";
        //public static string jiu = "酒久九玖韭灸糺韮乣氿舏杦紤镹乆奺汣";
        //public static string dong = "洞动栋冻動狪姛胨崠迵挏働燑垌絧峒腖戙駧侗棟凍烔勭硐娻胴恫霘湩";

        public static char[] yaos = new char[] { '么', '约', '要', '邀', '妖', '腰', '夭', '吆', '訞', '鴢', '撽', '殀', '喓', '鴁', '幺', '楆', '約', '葽', '枖', '祅' };
        public static char[] liangs = new char[] { '俩', '两', '啢', '脼', '魉', '唡', '緉', '裲', '兩', '掚', '蜽', '魎', '両', '倆', '良' };
        public static char[] sans = new char[] { '三', '参', '叁', '毶', '鬖', '叄', '毵', '犙', '厁', '參', '弎', '毿', '叅' };
        public static char[] sis = new char[] { '四', '饲', '似', '食', '寺', '肆', '伺', '涘', '鈻', '孠', '祀', '飤', '杫', '笥', '梩', '肂', '驷', '俟', '泗', '覗', '嗣', '洠', '鈶', '娰', '牭', '巳', '竢', '飼', '柶', '耜', '騃', '価', '汜', '蕼', '兕', '洍', '釲', '姒', '瀃', '銉', '禩', '飴', '亖', '枱', '耛', '駟', '佀', '榹', '儩', '泤', '貄' };
        public static char[] wus = new char[] { '伍', '武', '五', '舞', '侮', '午', '捂', '鹉', '乄', '忤', '膴', '迕', '儛', '鵡', '堥', '牾', '娬', '瑦', '廡', '碔', '仵', '憮', '躌', '倵', '旿', '陚', '啎', '熓', '娒', '珷', '庑', '瞴', '怃', '摀', '逜', '潕', '妩', '玝', '嫵', '甒' };
        public static char[] lius = new char[] { '六', '溜', '碌', '馏', '磟', '遛', '霤', '鹨', '磂', '翏', '雡', '餾', '廇', '鷚', '窌', '鎦', '飂', '塯', '鬸', '澑' };
        public static char[] guais = new char[] { '拐', '柺', '枴', '罫', '箉' };
        public static char[] bas = new char[] { '疤', '吧', '巴', '八', '扒', '捌', '叭', '笆', '芭', '仈', '羓', '夿', '豝', '鲃', '丷', '玐', '粑', '哵', '蚆', '峇', '魞', '扷', '柭', '哱', '岜', '釟', '朳' };
        public static char[] jius = new char[] { '酒', '久', '九', '玖', '韭', '灸', '糺', '韮', '乣', '氿', '舏', '杦', '紤', '镹', '乆', '奺', '汣' };
        public static char[] dongs = new char[] { '洞', '动', '栋', '冻', '動', '狪', '姛', '胨', '崠', '迵', '挏', '働', '燑', '垌', '絧', '峒', '腖', '戙', '駧', '侗', '棟', '凍', '烔', '勭', '硐', '娻', '胴', '恫', '霘', '湩' };

        public static bool CheckWords(string strKey, string input, out string output)
        {
            output = input;

            if (strKey.Length == 0)
            {
                return true;
            }
            else
            {
                if (input.Length == 0)
                {
                    return false;
                }
            }

            List<string> tempKeyList = new List<string>();

            bool _flag = false;

            if (strKey.Contains("、"))
            {
                tempKeyList = strKey.Split('、').ToList();
                _flag= CheckWordsAll(tempKeyList, input);
            }
            else
            {
                if (strKey.Contains("|"))
                {
                    tempKeyList = strKey.Split('|').ToList();
                    _flag= CheckAnyOneWords(tempKeyList, input);
                }
                else
                {
                    tempKeyList.Add(strKey);
                    _flag= CheckWordsAll(tempKeyList, input);
                }
            }

            if(_flag)
            {
                return _flag;
            }

            foreach (var item in yaos)
            {
                input = input.Replace(item, '1');
            }
            foreach (var item in liangs)
            {
                input = input.Replace(item, '2');
            }
            foreach (var item in sans)
            {
                input = input.Replace(item, '3');
            }
            foreach (var item in sis)
            {
                input = input.Replace(item, '4');
            }
            foreach (var item in wus)
            {
                input = input.Replace(item, '5');
            }
            foreach (var item in lius)
            {
                input = input.Replace(item, '6');
            }
            foreach (var item in guais)
            {
                input = input.Replace(item, '7');
            }
            foreach (var item in bas)
            {
                input = input.Replace(item, '8');
            }
            foreach (var item in jius)
            {
                input = input.Replace(item, '9');
            }
            foreach (var item in dongs)
            {
                input = input.Replace(item, '0');
            }

            output = input;

            if(strKey.Contains("、"))
            {
                tempKeyList = strKey.Split('、').ToList();
                return CheckWordsAll(tempKeyList, input);
            }
            else
            {
                if(strKey.Contains("|"))
                {
                    tempKeyList = strKey.Split('|').ToList();
                    return CheckAnyOneWords(tempKeyList,input);
                }
                else
                {
                    tempKeyList.Add(strKey);
                    return CheckWordsAll(tempKeyList, input);
                }
            }
        }

        public static bool CheckWordsAll(List<string> keys, string input)
        {
            //// 将关键词集合转换成拼音集合
            //Dictionary<string, string> dicKeysPY = new Dictionary<string, string>();
            //foreach (string item in keys)
            //{
            //    dicKeysPY.Add(item, PinYinHelper.GetAllPinYin(item));
            //}

            //input = input.Replace("1", "腰");
            //input = input.Replace("2", "两");
            //input = input.Replace("3", "三");
            //input = input.Replace("4", "四");
            //input = input.Replace("5", "五");
            //input = input.Replace("6", "六");
            //input = input.Replace("7", "拐");
            //input = input.Replace("8", "八");
            //input = input.Replace("9", "九");
            //input = input.Replace("0", "洞");

            //string inputRegex = Regex.Replace(input, @"[^\u4e00-\u9fa5]*", "");

            //string inputTextPY = PinYinHelper.GetAllPinYin(inputRegex);

            //foreach (var key in dicKeysPY.Keys)
            //{
            //    if (!inputTextPY.Contains(dicKeysPY[key]))
            //    {
            //        return false;
            //    }
            //}

            foreach (string item in keys)
            {
                if(item.Contains("|"))
                {
                    var _tempList = item.Split('|').ToList();
                    if(!CheckAnyOneWords(_tempList,input))
                    {
                        return false;
                    }
                }
                else if (!input.Contains(item.Trim()))
                {
                    return false;
                }
            }

            return true;
        }
        /// <summary>
        /// 检查关键词包含“|”任一匹配
        /// </summary>
        /// <param name="keys">关键词形成的或列表</param>
        /// <param name="input">语音内容</param>
        /// <returns>是否匹配</returns>
        public static bool CheckAnyOneWords(List<string> keys, string input)
        {
            foreach (string item in keys)
            {
                if (input.Contains(item.Trim()))
                {
                    return true;
                }
            }
            return false;
        }



        //private static KeyWordsCheck kwc = new KeyWordsCheck();
        ///// <summary>
        ///// 关键词检测
        ///// </summary>
        ///// <param name="keys">关键词集合</param>
        ///// <param name="input">输入文本</param>
        ///// <param name="output">替换关键字后返回的文本</param>
        ///// <returns></returns>
        //public static bool CheckWords(List<string> keys, string input, out string output)
        //{
        //    output = input;

        //    if (keys.Count == 0)
        //    {
        //        return true;
        //    }
        //    else
        //    {
        //        if (input.Length == 0)
        //        {
        //            return false;
        //        }
        //    }

        //    // 将关键词集合转换成拼音集合
        //    List<string> pinyinArray = new List<string>();
        //    foreach (string item in keys)
        //    {
        //        string key_pinyin = kwc.ConvertCnToPinyin(item);
        //        pinyinArray.Add(key_pinyin);
        //    }

        //    // 将输入文本转换成拼音文本
        //    string inputRegex = Regex.Replace(input, @"[^\u4e00-\u9fa5]*", "");
        //    string input_pinyin = kwc.ConvertCnToPinyin(inputRegex);

        //    // 按拼音匹配关键词
        //    for (int j = 0; j < pinyinArray.Count; j++)
        //    {
        //        string itemPinyin = pinyinArray[j];
        //        string itemWord = keys[j];
        //        if (!input_pinyin.Contains(itemPinyin))
        //        {
        //            output = input;
        //            return false;
        //        }

        //        string key_pinyin = itemPinyin.Replace(" ", "");
        //        // 先判断关键词的长度（二字关键词、三字关键词。。。。）
        //        string[] keyString = itemPinyin.Split(' ');
        //        int keyLength = keyString.Length;
        //        // 匹配关键词出现在原文本的位置
        //        string[] inputPinyinArray = input_pinyin.Split(' ');
        //        for (int i = 0; i < inputPinyinArray.Length - keyLength + 1; i++)
        //        {
        //            string[] _array = inputPinyinArray.Skip(i).Take(keyLength).ToArray();
        //            string key_word = String.Join("", _array);
        //            if (key_word == key_pinyin)
        //            {
        //                string txtWord = inputRegex.Substring(i, keyLength);
        //                input = input.Replace(txtWord, itemWord);
        //                break;
        //            }
        //        }
        //    }
        //    output = input;
        //    return true;
        //}
    }
}
